package com.evan.review.launchmode;

/**
 * Activity四种启动模式详解及面试要点
 * 
 * 一、四种启动模式基础知识
 * 
 * 1. standard（标准模式）
 *    - 默认的启动模式
 *    - 每次启动Activity都会创建一个新的实例，并放入任务栈的栈顶
 *    - 特点：可以多次创建同一个Activity的多个实例，并且这些实例会按照先后顺序放入同一个任务栈中
 * 
 * 2. singleTop（栈顶复用模式）
 *    - 如果要启动的Activity已经位于任务栈的栈顶，则直接复用该实例，并调用onNewIntent()方法
 *    - 如果不在栈顶，则创建新的实例并放入栈顶
 *    - 使用场景：通知栏点击打开的页面、避免重复创建页面
 * 
 * 3. singleTask（栈内复用模式）
 *    - 如果要启动的Activity已经位于任务栈中的某个位置，则将该Activity之上的所有Activity出栈，并调用该Activity的onNewIntent()方法
 *    - 如果不存在，则创建新的实例
 *    - 一般用于应用程序主界面或需要保证全局唯一的界面
 *    - 可以通过设置taskAffinity属性，指定该Activity所在任务栈的名字
 * 
 * 4. singleInstance（单实例模式）
 *    - 启动的Activity会独占一个任务栈，且该任务栈中只有这一个Activity实例
 *    - 系统中所有应用共享这个唯一的实例
 *    - 适用于需要与程序分离的界面，如来电显示界面
 * 
 * 二、Activity启动模式设置方式
 * 
 * 1. 通过AndroidManifest.xml配置
 *    <activity android:name=".XXXActivity" 
 *              android:launchMode="singleTask" />
 * 
 * 2. 通过Intent标记位设置（会覆盖AndroidManifest中的设置）
 *    Intent intent = new Intent(this, XXXActivity.class);
 *    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  // 相当于singleTask
 *    intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); // 相当于singleTop
 *    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // 清除目标Activity之上的所有Activity
 *    startActivity(intent);
 * 
 * 三、任务栈和taskAffinity
 * 
 * 1. 任务栈（Task Stack）
 *    - 是一个具有后进先出（LIFO）特性的栈结构，用于存储Activity实例
 *    - 按照后进先出的顺序，管理Activity的新建和销毁
 * 
 * 2. taskAffinity属性
 *    - 用于指定Activity所属的任务栈名称
 *    - 默认情况下，同一应用的所有Activity都在同一个任务栈中，名称为应用的包名
 *    - 可以通过设置不同的taskAffinity，将Activity放入不同的任务栈
 *    - 主要在singleTask和singleInstance模式中起作用
 *    - 配置方式：android:taskAffinity="com.example.task1"
 * 
 * 四、Activity启动模式相关面试题及回答要点
 * 
 * 1. 请详细说明Activity的四种启动模式的区别？
 *    答：[上述四种启动模式的详细说明]
 * 
 * 2. singleTask启动模式的Activity，在启动时会创建新的任务栈吗？
 *    答：不一定。如果Activity指定了与当前不同的taskAffinity，那么在启动时会创建新的任务栈；
 *        如果使用相同的taskAffinity，则会在原任务栈中查找是否存在该Activity的实例。
 * 
 * 3. 如何实现点击通知栏消息不重复打开Activity？
 *    答：可以使用singleTop启动模式，或者使用Intent.FLAG_ACTIVITY_SINGLE_TOP标志。
 *        这样当通知点击打开已在栈顶的Activity时，会复用该实例并调用onNewIntent()方法更新数据。
 * 
 * 4. onNewIntent()方法在什么情况下会被调用？
 *    答：当一个Activity的启动模式为singleTop、singleTask或singleInstance，
 *        并且该Activity的实例已存在于任务栈中被复用时，会调用onNewIntent()方法。
 *        这个方法会在onResume()之前被调用，用于接收新的Intent并更新Activity状态。
 * 
 * 5. Intent的Flag与launchMode的区别？
 *    答：(1) 优先级不同：Intent的Flag优先级高于AndroidManifest中设置的launchMode
 *        (2) 使用场景不同：launchMode在AndroidManifest中是静态设置，对所有的启动方式生效；
 *            而Intent Flag是动态设置，只对当前的启动方式生效
 *        (3) Flag可以设置更多控制，如FLAG_ACTIVITY_CLEAR_TOP等在launchMode中没有对应项
 * 
 * 6. 为什么会有任务栈的设计？
 *    答：任务栈设计是为了维护用户使用应用程序的导航体验。它能够：
 *        (1) 保持Activity的调用关系，便于回退操作
 *        (2) 管理应用和Activity的生命周期
 *        (3) 支持多应用间的交互和回退处理
 *        (4) 提供良好的用户体验，如按Back键可以按照启动的逆序返回上一个Activity
 * 
 * 7. singleInstance与singleTask的主要区别？
 *    答：singleInstance始终创建新的任务栈，且该任务栈中只允许有这一个Activity；
 *        而singleTask可以与其他Activity共存于同一个任务栈中，只是保证同一个任务栈
 *        中只有一个实例。
 * 
 * 8. 什么情况下我们会使用singleInstance模式？
 *    答：当某个Activity需要独立存在，且可能被多个应用共享访问时，例如：
 *        (1) 系统级弹窗，如来电界面
 *        (2) APP分享功能
 *        (3) 第三方登录授权页面
 *        (4) 需要全局共享且独立的页面
 */
public class LaunchModeDoc {
    // 这是一个文档类，只包含注释，没有实际代码
} 